//package com.plian.system.service.sys.warning.impl;
//
//import com.baomidou.mybatisplus.core.toolkit.Wrappers;
//import com.plian.Tools.CollectionUtil;
//import com.plian.Tools.DateUtil;
//import com.plian.system.dto.sys.warning.WarningMessageDTO;
//import com.plian.system.entity.sys.Org;
//import com.plian.system.entity.sys.warning.WarningMessage;
//import com.plian.system.entity.sys.warning.WarningMessageConfig;
//import com.plian.system.properties.GzwProperties;
//import com.plian.system.service.sys.orgzation.IOrgService;
//import com.plian.system.service.sys.warning.IWarningMessageConfigService;
//import com.plian.system.service.sys.warning.IWarningMessageService;
//import com.plian.system.service.sys.warning.IWarningViewService;
//import com.plian.system.vo.report.*;
//import com.plian.system.vo.sys.warning.MessageListViewVO;
//import com.plian.system.vo.sys.warning.WarningMessageVO;
//import com.plian.system.vo.sys.warning.WarningScatterVO;
//import lombok.AllArgsConstructor;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.stereotype.Service;
//
//import java.util.*;
//import java.util.stream.Collectors;
//
///**
// * @Description:  预警查看实现层
// * @Author: Take-off
// * @Date: 2023/4/25 3:55 PM
// * @Param
// * @return
// * @Version: 1.0
// **/
//@Service
//@Slf4j
//@AllArgsConstructor
//public class WarningViewServiceImpl implements IWarningViewService {
//
//    private final IWarningMessageService warningMessageService;
//
//    private final IWarningMessageConfigService messageConfigService;
//
//    private final IOrgService orgService;
//
//    private final GzwProperties gzwProperties;
//
//    @Override
//    public MessageListViewVO warningContentList(WarningMessageDTO dto){
//        MessageListViewVO messageListViewVO = new MessageListViewVO();
//
//        List<WarningMessageVO> warningMessageVOS = new ArrayList<>();
//
//        // 根据时间，业务模块，组织查询 预警信息
//        List<WarningMessage> warningMessages = getWarningMessages(dto);
//        if (CollectionUtil.isNotEmpty(warningMessages)){
//            Map<String, List<WarningMessage>> mapByIndex = warningMessages.stream().filter(m -> Optional.ofNullable(m.getWarningIndex()).isPresent()).collect(Collectors.groupingBy(WarningMessage::getWarningIndex));
//            for (String index:mapByIndex.keySet()){
//                WarningMessageVO warningMessageVO = new WarningMessageVO();
//                warningMessageVO.setWarningIndex(index);
//                List<WarningMessage> messages = mapByIndex.get(index);
//                WarningMessage tempMessage = messages.get(0);
//                warningMessageVO.setBusinessModule(tempMessage.getBusinessModule());
//                warningMessageVO.setBusinessUnit(tempMessage.getBusinessUnit());
//                warningMessageVO.setWarningEvent(tempMessage.getWarningEvent());
//
//                Map<String, Integer> warningLightCount = getTypeCount(messages);
//                warningMessageVO.setWarningLightCount(warningLightCount);
//                warningMessageVOS.add(warningMessageVO);
//            }
//            Map<String, Integer> warningLightCount = getTypeCount(warningMessages);
//            messageListViewVO.setWarningLightCount(warningLightCount);
//            //排序
//            warningMessageVOS = warningMessageVOS.stream().sorted(Comparator.comparing(WarningMessageVO::getBusinessModule).thenComparing(WarningMessageVO::getBusinessUnit)
//                    .thenComparing(WarningMessageVO::getWarningEvent).thenComparing(WarningMessageVO::getWarningIndex)).collect(Collectors.toList());
//            messageListViewVO.setWarningMessageVOS(warningMessageVOS);
//        }
//
//        return messageListViewVO;
//    }
//
//    @Override
//    public PieChartVO warningContentCake(WarningMessageDTO dto){
//        PieChartVO pieChartVO = new PieChartVO();
//        List<PieValueVO> pieValueVOS = new ArrayList<>();
//        pieChartVO.setData(pieValueVOS);
//
//        List<WarningMessage> warningMessages = getWarningMessages(dto);
//        if (CollectionUtil.isNotEmpty(warningMessages)){
//            Map<Integer, List<WarningMessage>> mapByLightType = warningMessages.stream().filter(m -> Optional.ofNullable(m.getWarningLightType()).isPresent()).collect(Collectors.groupingBy(WarningMessage::getWarningLightType));
//            for (Integer lightType:mapByLightType.keySet()){
//                PieValueVO valueVO = new PieValueVO();
//                valueVO.setName(lightType.toString());
//                valueVO.setValue(mapByLightType.get(lightType).size());
//                pieValueVOS.add(valueVO);
//            }
//        }
//        return pieChartVO;
//    }
//
//    @Override
//    public ChartsVO warningContentColumnar(WarningMessageDTO dto){
//        ChartsVO chartsVO = new ChartsVO();
//        //x轴
//        List<XAxisVO> xAxisVOList = new ArrayList<>();
//        XAxisVO xAxisVO = new XAxisVO();
//        List<String> xAxisVOData = new ArrayList<>();
//        xAxisVO.setData(xAxisVOData);
//        xAxisVOList.add(xAxisVO);
//        chartsVO.setXAxis(xAxisVOList);
//        //值
//        List<SeriesVO> seriesVOList = new ArrayList<>();
//        chartsVO.setSeries(seriesVOList);
//        List<WarningMessage> warningMessages = getWarningMessages(dto);
//        if (CollectionUtil.isNotEmpty(warningMessages)){
//
//            //判断预警事项
//            Set<String> eventTypes = warningMessages.stream().map(WarningMessage::getWarningEvent).filter(m -> Optional.ofNullable(m).isPresent()).collect(Collectors.toSet());
//            //灯类别
//            Map<Integer, List<WarningMessage>> mapByLightType = warningMessages.stream().filter(m -> Optional.ofNullable(m.getWarningLightType()).isPresent()).collect(Collectors.groupingBy(WarningMessage::getWarningLightType));
//
//            if (eventTypes.size() > 2) {
//                xAxisVO.setData(new ArrayList<>(eventTypes));
//                for (Integer type:mapByLightType.keySet()){
//                    SeriesVO seriesVO = SeriesVO.builder().name(type.toString()).type("bar").build();
//                    List<Object> data = new ArrayList<>();
//                    List<WarningMessage> messages = mapByLightType.get(type);
//                    for (String eventType:eventTypes){
//                        long count = messages.stream().filter(m -> Optional.ofNullable(m.getWarningEvent()).isPresent() && eventType.equals(m.getWarningEvent())).count();
//                        data.add(count);
//                    }
//                    seriesVO.setData(data);
//                    seriesVOList.add(seriesVO);
//                }
//            }else {
//                //显示预警指标
//                Set<String> indexTypes= warningMessages.stream().map(WarningMessage::getWarningIndex).filter(m -> Optional.ofNullable(m).isPresent()).collect(Collectors.toSet());
//                xAxisVO.setData(new ArrayList<>(indexTypes));
//                for (Integer type:mapByLightType.keySet()){
//                    SeriesVO seriesVO = SeriesVO.builder().name(type.toString()).type("bar").build();
//                    List<Object> data = new ArrayList<>();
//                    List<WarningMessage> messages = mapByLightType.get(type);
//                    for (String indexType:indexTypes){
//                        long count = messages.stream().filter(m -> Optional.ofNullable(m.getWarningIndex()).isPresent() && indexType.equals(m.getWarningIndex())).count();
//                        data.add(count);
//                    }
//                    seriesVO.setData(data);
//                    seriesVOList.add(seriesVO);
//                }
//
//            }
//        }
//        return chartsVO;
//    }
//
//    @Override
//    public MessageListViewVO warningOrgList(WarningMessageDTO dto){
//        MessageListViewVO messageListViewVO = new MessageListViewVO();
//
//        List<WarningMessageVO> warningMessageVOS = new ArrayList<>();
//
//        // 根据时间，业务模块，组织查询 预警信息
//        List<WarningMessage> warningMessages = getWarningMessages(dto);
//        if (CollectionUtil.isNotEmpty(warningMessages)){
//            List<Org> allOrg = orgService.getAllOrg();
//
//            Map<String, List<WarningMessage>> mapByGroup = warningMessages.stream().filter(m -> Optional.ofNullable(m.getSubordinateGroup()).isPresent()).collect(Collectors.groupingBy(WarningMessage::getSubordinateGroup));
//            for (String group:mapByGroup.keySet()){
//                String subCode = "";
//                String subordinateGroupName = "";
//                Optional<Org> subOptional = allOrg.stream().filter(m -> group.equals(m.getId())).findFirst();
//                if (subOptional.isPresent()){
//                    Org subGroup = subOptional.get();
//                    subCode = subGroup.getOrgCode();
//                    subordinateGroupName = subGroup.getName();
//                }
//                List<WarningMessage> messages = mapByGroup.get(group);
//                Map<String, List<WarningMessage>> mapByOrg = messages.stream().filter(m -> Optional.ofNullable(m.getWarningOrg()).isPresent()).collect(Collectors.groupingBy(WarningMessage::getWarningOrg));
//
//                for (String orgId:mapByOrg.keySet()){
//                    WarningMessageVO warningMessageVO = new WarningMessageVO();
//                    warningMessageVO.setSubordinateGroup(group);
//                    warningMessageVO.setSubordinateGroupName(subordinateGroupName);
//                    Optional<Org> orgOptional = allOrg.stream().filter(m -> orgId.equals(m.getId())).findFirst();
//                    if (orgOptional.isPresent()){
//                        Org org = orgOptional.get();
//                        String orgCode = org.getOrgCode();
//                        String name = org.getName();
//                        int level = (orgCode.length() - subCode.length()) / 2;
//                        warningMessageVO.setWarningOrgLevel(level);
//                        warningMessageVO.setWarningOrgCode(orgCode);
//                        warningMessageVO.setWarningOrg(org.getId());
//                        if (level > 0){
//                            StringBuilder nameStr = new StringBuilder();
//                            for (int i =0 ;i < level; i++){
//                                nameStr.append(" ");
//                            }
//                            nameStr.append(name);
//                            name = nameStr.toString();
//                        }
//                        warningMessageVO.setWarningOrgName(name);
//                        Map<String, Integer> warningLightCount = getTypeCount(messages);
//                        warningMessageVO.setWarningLightCount(warningLightCount);
//                        warningMessageVOS.add(warningMessageVO);
//                    }
//                }
//            }
//            Map<String, Integer> warningLightCount = getTypeCount(warningMessages);
//            messageListViewVO.setWarningLightCount(warningLightCount);
//            //排序
//            warningMessageVOS = warningMessageVOS.stream().sorted(Comparator.comparing(WarningMessageVO::getSubordinateGroup).thenComparing(WarningMessageVO::getWarningOrgLevel)
//                    .thenComparing(WarningMessageVO::getWarningOrgCode)).collect(Collectors.toList());
//            messageListViewVO.setWarningMessageVOS(warningMessageVOS);
//        }
//        return messageListViewVO;
//    }
//
//    @Override
//    public ChartsVO warningOrgColumnar(WarningMessageDTO dto){
//        ChartsVO chartsVO = new ChartsVO();
//        //x轴
//        List<XAxisVO> xAxisVOList = new ArrayList<>();
//        XAxisVO xAxisVO = new XAxisVO();
//        List<String> xAxisVOData = new ArrayList<>();
//        xAxisVO.setData(xAxisVOData);
//        xAxisVOList.add(xAxisVO);
//        chartsVO.setXAxis(xAxisVOList);
//        List<WarningMessage> warningMessages = getWarningMessages(dto);
//        if (CollectionUtil.isNotEmpty(warningMessages)) {
//            //灯类别
//            Map<Integer, List<WarningMessage>> mapByLightType = warningMessages.stream().filter(m -> Optional.ofNullable(m.getWarningLightType()).isPresent()).collect(Collectors.groupingBy(WarningMessage::getWarningLightType));
//            Set<String> orgNames = new HashSet<>();
//            List<Org> allOrg = orgService.getAllOrg();
//            String orgId = dto.getOrgId();
//            Set<String> orgIds = getOrgIds(orgId, allOrg, warningMessages);
//            if (CollectionUtil.isNotEmpty(orgIds)){
//                //值
//                List<SeriesVO> seriesVOList = getSeriesVO(mapByLightType,orgIds,allOrg,orgNames);
//                chartsVO.setSeries(seriesVOList);
//            }
//            xAxisVO.setData(new ArrayList<>(orgNames));
//        }
//        return chartsVO;
//    }
//
//    @Override
//    public ChartsVO warningScatter(WarningMessageDTO dto){
//        ChartsVO chartsVO = new ChartsVO();
//        //x轴
//        List<XAxisVO> xAxisVOList = new ArrayList<>();
//        XAxisVO xAxisVO = new XAxisVO();
//        List<String> xAxisVOData = new ArrayList<>();
//        xAxisVO.setData(xAxisVOData);
//        xAxisVOList.add(xAxisVO);
//        chartsVO.setXAxis(xAxisVOList);
//        //y轴
//        List<XAxisVO> yAxisVOList = new ArrayList<>();
//        XAxisVO yAxisVO = new XAxisVO();
//        List<String> yAxisVOData = new ArrayList<>();
//        yAxisVO.setData(yAxisVOData);
//        yAxisVOList.add(yAxisVO);
//        chartsVO.setYAxis(yAxisVOList);
//
//        List<WarningMessage> warningMessages = getWarningMessages(dto);
//
//        List<Org> allOrg = orgService.getAllOrg();
//        String searchOrg = dto.getOrgId();
//        Set<String> orgIds = getOrgIds(searchOrg, allOrg, warningMessages);
//
//        //切分时间
//        List<String> dateStrs = DateUtil.findDatesByDay(5, dto.getWarningStartDate(), dto.getWarningEndDate());
//
//        //预警事项
//        List<String> warningEvents = new ArrayList<>();
//        List<WarningMessageConfig> messageConfigs = messageConfigService.list();
//        if (CollectionUtil.isNotEmpty(messageConfigs)){
//            warningEvents = messageConfigs.stream().map(WarningMessageConfig::getWarningMatters).filter(m -> Optional.ofNullable(m).isPresent()).collect(Collectors.toList());
//        }
//        yAxisVO.setData(warningEvents);
//        if (CollectionUtil.isNotEmpty(orgIds)){
//            //13家集团
//           List<String> orgNames = orgService.directlyUnderUnit().stream().map(Org::getName).collect(Collectors.toList());
//           List<SeriesVO> seriesVOList =new ArrayList<>();
//           chartsVO.setSeries(seriesVOList);
//           for (String orgId:orgIds){
//               String orgName = "";
//               Optional<Org> orgOptional = allOrg.stream().filter(m -> orgId.equals(m.getId())).findFirst();
//               if (orgOptional.isPresent()){
//                   Org org = orgOptional.get();
//                   orgName = org.getName();
////                   orgNames.add(orgName);
//               }
//               for (String event:warningEvents) {
//                   SeriesVO seriesVO = SeriesVO.builder().build();
//                   List<Object> data = new ArrayList<>();
//                   List<WarningMessage> messages = warningMessages.stream().filter(m -> Optional.ofNullable(m.getWarningEvent()).isPresent() && event.equals(m.getWarningEvent())
//                           && Optional.ofNullable(m.getWarningOrg()).isPresent() && orgId.equals(m.getWarningOrg())).collect(Collectors.toList());
//                   if (CollectionUtil.isNotEmpty(messages)) {
//                       data.add(orgName);
//                       data.add(event);
//                       data.add(messages.size());
//                       List<WarningScatterVO> warningScatterVOS = new ArrayList<>();
//                       //时间粒度
//                       for (String dateStr : dateStrs) {
//                           WarningScatterVO warningScatterVO = new WarningScatterVO();
//                           warningScatterVO.setDate(dateStr);
//                           Date startDate = DateUtil.parse(dateStr, DateUtil.PATTERN_DATE);
//                           Date endDate = DateUtil.plusDays(startDate, 1);
//                           List<WarningMessage> dateMessages = warningMessages.stream().filter(m -> Optional.ofNullable(m.getWarningDate()).isPresent() && startDate.compareTo(m.getWarningDate()) <= 0 && endDate.compareTo(m.getWarningDate()) > 0).collect(Collectors.toList());
//                           if (CollectionUtil.isNotEmpty(dateMessages)) {
//                               int total = dateMessages.size();
//                               warningScatterVO.setTotal(total);
//                               //已处置
//                               List<WarningMessage> successMessages = dateMessages.stream().filter(m -> Optional.ofNullable(m.getStatus()).isPresent() && m.getStatus() == 3).collect(Collectors.toList());
//                               if (CollectionUtil.isNotEmpty(successMessages)) {
//                                   int disposed = successMessages.size();
//                                   warningScatterVO.setDisposed(disposed);
//                                   warningScatterVO.setProgress(total - disposed);
//                               } else {
//                                   warningScatterVO.setDisposed(0);
//                                   warningScatterVO.setProgress(total);
//                               }
//                           } else {
//                               warningScatterVO.setTotal(0);
//                               warningScatterVO.setDisposed(0);
//                               warningScatterVO.setProgress(0);
//                           }
//                           warningScatterVOS.add(warningScatterVO);
//                       }
//                       data.add(warningScatterVOS);
//                   }
//                   seriesVO.setData(data);
//                   seriesVOList.add(seriesVO);
//               }
//           }
//            xAxisVO.setData(orgNames);
//       }
//        return chartsVO;
//    }
//
//    /**
//     * @Description: //TODO 获取下级单位
//     * @Author: Take-off
//     * @Date: 4:24 PM 2023/4/26
//     * @Param: [orgId, allOrg, warningMessages]
//     * @return: java.util.Set<java.lang.String>
//     **/
//    private Set<String> getOrgIds(String orgId,List<Org> allOrg,List<WarningMessage> warningMessages){
//        Set<String> orgIds = new HashSet<>();
//        //判断是否国资委
//        if (gzwProperties.getId().equals(orgId)){
//            //13家集团
//            orgIds = warningMessages.stream().map(WarningMessage::getSubordinateGroup).filter(m -> Optional.ofNullable(m).isPresent()).collect(Collectors.toSet());
//        }else {
//            //2级企业
//            List<Org> secondOrges = allOrg.stream().filter(m -> Optional.ofNullable(m.getParentId()).isPresent() && orgId.equals(m.getParentId())).collect(Collectors.toList());
//            Set<String>  secondOrgIds = warningMessages.stream().map(WarningMessage::getWarningOrg).filter(m -> Optional.ofNullable(m).isPresent() &&
//                    secondOrges.stream().map(Org::getId).collect(Collectors.toList()).contains(m)).collect(Collectors.toSet());
//            orgIds.add(orgId);
//            orgIds.addAll(secondOrgIds);
//        }
//        return orgIds;
//    }
//
//
//    /**
//     * @Description: //TODO 获取组织-柱状图 数据
//     * @Author: Take-off
//     * @Date: 4:01 PM 2023/4/26
//     * @Param: [mapByLightType, orgIds, allOrg, orgNames]
//     * @return: java.util.List<com.plian.system.vo.report.SeriesVO>
//     **/
//    private  List<SeriesVO> getSeriesVO(Map<Integer, List<WarningMessage>> mapByLightType,Set<String> orgIds,List<Org> allOrg,Set<String> orgNames){
//        List<SeriesVO> seriesVOList = new ArrayList<>();
//        for (Integer type:mapByLightType.keySet()){
//            SeriesVO seriesVO = SeriesVO.builder().name(type.toString()).type("bar").build();
//            List<Object> data = new ArrayList<>();
//            List<WarningMessage> messages = mapByLightType.get(type);
//            for (String orgId:orgIds){
//                allOrg.stream().filter(m -> orgId.equals(m.getId())).findFirst().ifPresent(org -> orgNames.add(org.getName()));
//                long count = messages.stream().filter(m -> Optional.ofNullable(m.getSubordinateGroup()).isPresent() && orgId.equals(m.getSubordinateGroup())).count();
//                data.add(count);
//            }
//            seriesVO.setData(data);
//            seriesVOList.add(seriesVO);
//        }
//        return seriesVOList;
//    }
//
//    /**
//     * @Description: //TODO 获取灯类型数量
//     * @Author: Take-off
//     * @Date: 11:21 AM 2023/4/26
//     * @Param: [messages]
//     * @return: java.util.Map<java.lang.String,java.lang.Integer>
//     **/
//    private Map<String, Integer> getTypeCount(List<WarningMessage> messages){
//        Map<Integer, List<WarningMessage>> mapByLightType = messages.stream().filter(m -> Optional.ofNullable(m.getWarningLightType()).isPresent()).collect(Collectors.groupingBy(WarningMessage::getWarningLightType));
//        Map<String, Integer> warningLightCount = new HashMap<>();
//        for (Integer lightType:mapByLightType.keySet()){
//            warningLightCount.put(lightType.toString(),mapByLightType.get(lightType).size());
//        }
//        return warningLightCount;
//    }
//
//    /**
//     * @Description:  根据时间，业务模块，组织查询 预警信息
//     * @Author: Take-off
//     * @Date: 4:51 PM 2023/4/25
//     * @Param: [dto]
//     * @return: java.util.List<com.plian.system.entity.sys.warning.WarningMessage>
//     **/
//    private List<WarningMessage>  getWarningMessages(WarningMessageDTO dto){
//        // 获取查询组织所有子集
//        Optional.ofNullable(dto.getOrgId()).ifPresent(orgId ->{
//            dto.setOrgIds( orgService.getAllChildIds(orgId));
//        });
//        // 根据时间，业务模块，组织查询 预警信息
//        return warningMessageService.list(Wrappers.<WarningMessage>lambdaQuery()
//                .gt(Optional.ofNullable(dto.getWarningStartDate()).isPresent(), WarningMessage::getWarningDate, dto.getWarningStartDate())
//                .lt(Optional.ofNullable(dto.getWarningEndDate()).isPresent(), WarningMessage::getWarningDate, dto.getWarningEndDate())
//                .in(CollectionUtil.isNotEmpty(dto.getBusinessModules()), WarningMessage::getBusinessModule, dto.getBusinessModules())
//                .in(CollectionUtil.isNotEmpty(dto.getOrgIds()), WarningMessage::getWarningOrg, dto.getOrgIds())
//        );
//    }
//}
